package com.mh.log;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

//@RunWith(SpringRunner.class) 是Junit注解,Junit版本必须高于4.12,否则启动不了
@SpringBootTest
@Slf4j  //Lombok依赖的注解
public class LogDemo {

    Logger logger = LoggerFactory.getLogger(LogDemo.class);

    @Test
    public void testLog(){
        //LoggerFactory: org.slf4j.LoggerFactory;
        logger.info("Hello LogBack!");
    }

    //方式1: 传统方式
    @Test
    public void testLog2(){
        logger.error("发生了严重错误,程序阻断了,需要立即处理,发送警报");
        logger.warn("这个错误很少见,不影响程序继续运行,酌情处理");
        logger.info("没有什么问题,单纯想打印个日志");
        logger.debug("你经常写BUG,测试的时候,多打点日志");
        logger.trace("这个级别很少用,为了追踪");
    }

    //方式2: 在类上添加@Slf4j,可以直接使用log.打印日志
    @Test
    public void testLog3(){
        log.error("发生了严重错误,程序阻断了,需要立即处理,发送警报");
        log.warn("这个错误很少见,不影响程序继续运行,酌情处理");
        log.info("没有什么问题,单纯想打印个日志");
        log.debug("你经常写BUG,测试的时候,多打点日志");
        log.trace("这个级别很少用,为了追踪");
    }

    @Test
    public void logNorm(){

        //规范1: 使用{}作为占位符,而不是字符串拼接(占位符/拼接-->效果都一样)
        String name = "我是郭郭";
        log.info("hello {}",name); //推荐:占位符-->{}会拼接上","后面的变量
        log.debug("hello " + name); //字符串拼接

        //{}是占位符,""后面填入的参数,按顺序依次填入到{}中
        //{}占位个数 > 后面的参数 --> {}直接视作字符串输出
        String userId = "111";
        String orderId = "222";
        log.debug("记录当前订单的用户ID:{} and 订单ID : {}",userId,orderId);
        //记录当前订单的用户ID:111 and 订单ID : 222
        log.debug("记录当前订单的用户ID:{} and 订单ID : {}",userId);
        //记录当前订单的用户ID:111 and 订单ID : {}

        //规范2: 用log.打印日志, 不使用e.printStackTrace(), 打印堆栈日志与业务日志混合
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            // e.printStackTrace();

            log.error("异常信息:{}",e.getMessage()); //异常信息:/ by zero
            log.error(e.getMessage(),e); // / by zero加上一长串的异常信息

        }

        //规范3: 增加对级别日志的判断
        //执行顺序: 先 拼接字符串“hello”和“name”; 再 执行debug方法,判断日志级别-->当前是info,那就不打印
        //不推荐-->增加内存开销
        log.debug("hello" + name);

        //推荐: 先 判断日志级别, 再 选择是否执行debug方法, 最后 需要再拼接字符串“hello”和“world”
        //isDebugEnabled() 可以避免无用的字符串操作，提高性能
        if(log.isDebugEnabled()){
            log.debug("hello" + name);
        }
    }
}

